/* TP1 7529 - Amigos en Facebook - 2C 2014            */
/* 79979 Gonzalez, Juan Manuel (juanmg0511@gmail.com) */
/* 94773 Condo, Emanuel (emanuelcondo@gmail.com)      */
/* 94176 Bolaño, Nahuel (naku07@gmail.com)            */

import java.util.ArrayList;

import modelo.Constantes;
import modelo.Facebook;
import modelo.Grafo;
import modelo.Usuario;
import es.Parser;

public class TP1 {
	
	public static void main(String[] args) {

		int i = 0;
		boolean mostrarAyuda = false;
		boolean mostrarVersion = false;
		boolean calcularPopularidad = false;
		boolean calcularInfluencias = false;
		boolean calcularRecomendaciones = false;
		
        //Valida las opciones ingresadas
		while (i < args.length && args[i].startsWith("-")) {

			String argumentoActual = args[i++];
            for (int j = 1; j < argumentoActual.length(); j++) {
            	
            	boolean esOpcionLarga = false;
                char opcionActual = argumentoActual.charAt(j);
                switch (opcionActual) {
                	case 'h':
                		mostrarAyuda = true;
                		break;
                	case 'V':
                		mostrarVersion = true;
                		break;
	                case 'p':
	                	calcularPopularidad = true;
	                    break;
	                case 'i':
	                	calcularInfluencias = true;
	                    break;
	                case 'r':
	                	calcularRecomendaciones = true;
	                    break;
	                case '-':
	                	//Manejo de opciones largas
	                	switch (argumentoActual.substring(2)) {
	                		case "help":
	                			mostrarAyuda = true;
	                			break;
	                		case "version":
	                			mostrarVersion = true;
	                			break;
		                	case "popularidad":
		                		calcularPopularidad = true;
		                		break;
		                	case "influencias":
		                		calcularInfluencias = true;
		                		break;
		                	case "recomendaciones":
		                		calcularRecomendaciones = true;
		                		break;
		                	default:
		                        System.err.println("Error: opción `" + argumentoActual.substring(2) + "' inválida.");
		                        System.err.println(Constantes.infoLeermas);
		                        System.exit(Constantes.EXIT_FAILURE);
		                        break;
	                	}
	                	esOpcionLarga = true;
	                	break;
	                default:
	                    System.err.println("Error: opción `" + opcionActual + "' inválida.");
	                    System.err.println(Constantes.infoLeermas);
	                    System.exit(Constantes.EXIT_FAILURE);
	                    break;
                }
                
                if (esOpcionLarga)
                	break;
                
            }
        
		}

		//Valida la cantidad de argumentos con la que es llamado el programa, si la sintaxis no es correcta sale
		if ((args.length == 0) || ((args.length - i) > 1)) {
			System.err.println("Error: sintaxis inválida.");
			System.err.println(Constantes.infoLeermas);
            System.exit(Constantes.EXIT_FAILURE);
		}
				
		//Muestra la ayuda y sale
		if (mostrarAyuda) {
			System.out.println(Constantes.infoAyuda);
			System.exit(Constantes.EXIT_SUCCESS);
		}

        //Muestra la version y sale
		if (mostrarVersion) {
            System.out.println(Constantes.infoVersion);
            System.exit(Constantes.EXIT_SUCCESS);
		}
		
		//Selecciona la opcion por default si no fue especificada
		if (!calcularPopularidad && !calcularInfluencias && !calcularRecomendaciones) calcularPopularidad = true;
       
		ArrayList<Usuario> listaUsuarios = new ArrayList<Usuario>();
		ArrayList<String> listaAmigos = new ArrayList<String>();
		
		String rutaArchivoEntrada = args[i];
		Parser.parsearEntrada(rutaArchivoEntrada, listaUsuarios, listaAmigos);

		Grafo grafoAmigos = new Grafo();
		grafoAmigos.cargarUsuarios(listaUsuarios);
		grafoAmigos.enlazarUsuarios(listaAmigos);
		
		Facebook facebook = new Facebook(grafoAmigos);
		
		//Calula y genera la salida del programa
		if (calcularPopularidad) {
			String rutaArchivoSalida = rutaArchivoEntrada.substring(rutaArchivoEntrada.lastIndexOf(System.getProperty("file.separator"))+1) + Constantes.sufijoSalidaPop;

			facebook.losMasPopulares(rutaArchivoSalida);
			System.out.println("Se generó exitosamente el archivo `" + rutaArchivoSalida + "'.");
		}
		
		if (calcularInfluencias) {
			String rutaArchivoSalida = rutaArchivoEntrada.substring(rutaArchivoEntrada.lastIndexOf(System.getProperty("file.separator"))+1) + Constantes.sufijoSalidaInf;

			facebook.losMasInfluyentes(rutaArchivoSalida);
			System.out.println("Se generó exitosamente el archivo `" + rutaArchivoSalida + "'.");
		}
		
		if (calcularRecomendaciones) {
			String rutaArchivoSalida = rutaArchivoEntrada.substring(rutaArchivoEntrada.lastIndexOf(System.getProperty("file.separator"))+1) + Constantes.sufijoSalidaRec;

			facebook.recomendaciones(rutaArchivoSalida);
			System.out.println("Se generó exitosamente el archivo `" + rutaArchivoSalida + "'.");
		}
		
		System.exit(Constantes.EXIT_SUCCESS);		
	}
}
